//package com.example.project.service;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Objects;
//import java.util.stream.Collectors;
//
//import javax.management.relation.Relation;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import com.example.project.entity.Attachment;
//import com.example.project.entity.CustomField;
//import com.example.project.entity.Issue;
//import com.example.project.entity.Journal;
//import com.example.project.entity.JournalDetail;
//import com.example.project.entity.Project;
//import com.example.project.entity.User;
//import com.example.project.service.impl.IssueStatus;
//import com.example.project.service.impl.Notifiable;
//import com.example.project.service.impl.ProjectAssociated;
//
//import cn.hutool.setting.Setting;
//
///**
// * 问题变更历史主，记录Issue等对象的变更信息Service接口
// * 
// * @author ruoyi
// * @date 2025-09-26
// */
//@Service
//public class TJournalService {
//	
//	@Autowired
//	IssueService issueService;
//
//	/**
//	 * 创建新的Journal记录
//	 */
//	public Journal createJournal(String journalizedType, Long journalizedId, Long userId, String notes) {
//		Journal journal = new Journal(journalizedType, journalizedId, userId);
//		journal.setNotes(notes);
//		journal.start();
//
//		if (journal.save()) {
//			return journal;
//		}
//		return null;
//	}
//
//	/**
//	 * 根据ID查找Journal
//	 */
//	public Journal findById(Long id) {
//		// 实现数据库查找逻辑
//		return null;
//	}
//
//	/**
//	 * 查找问题的所有Journal记录
//	 */
//	public List<Journal> findJournalsByIssue(Long issueId) {
//		// 实现数据库查找逻辑
//		return List.of();
//	}
//
//	/**
//	 * 获取可见的Journal详情
//	 */
//	public List<JournalDetail> getVisibleDetails(Journal journal, User user) {
//		return journal.getDetails().stream().filter(detail -> isDetailVisible(detail, user, journal.getProject()))
//				.collect(Collectors.toList());
//	}
//
//	/**
//	 * 检查详情是否可见
//	 */
//	private boolean isDetailVisible(JournalDetail detail, User user, Project project) {
//		if ("cf".equals(detail.getProperty())) {
//			CustomField field = detail.getCustomField();
//			return field != null && field.isVisible(project, user);
//		} else if ("relation".equals(detail.getProperty())) {
//			// 检查关系是否可见
//			String issueIdStr = detail.getValue() != null ? detail.getValue() : detail.getOldValue();
//			if (issueIdStr != null) {
//				try {
//					Long issueId = Long.parseLong(issueIdStr);
//					Issue issue = issueService.getById(issueId);
//					return issue != null && issue.isVisible(user);
//				} catch (NumberFormatException e) {
//					return false;
//				}
//			}
//		}
//		return true;
//	}
//
//	/**
//	 * 预加载Journal详情中的自定义字段
//	 */
//	public void preloadJournalDetailsCustomFields(List<Journal> journals) {
//		// 实现预加载逻辑，减少数据库查询
//	}
//
//	/**
//	 * 记录属性变更
//	 */
//	public void journalizeAttributeChange(Journal journal, String attribute, Object oldValue, Object newValue) {
//		journal.addAttributeDetail(attribute, oldValue, newValue);
//	}
//
//	/**
//	 * 记录自定义字段变更
//	 */
//	public void journalizeCustomFieldChange(Journal journal, Long customFieldId, Object oldValue, Object newValue) {
//		journal.addCustomFieldDetail(customFieldId, oldValue, newValue);
//	}
//
//	/**
//	 * 发送通知
//	 */
//	public void sendNotifications(Journal journal) {
//		if (journal.shouldNotify() && shouldSendNotification(journal)) {
//			Mailer.deliverIssueEdit(journal);
//		}
//	}
//
//	/**
//	 * 检查是否需要发送通知
//	 */
//	private boolean shouldSendNotification(Journal journal) {
//		List<String> notifiedEvents = Setting.getNotifiedEvents();
//
//		if (notifiedEvents.contains("issue_updated")) {
//			return true;
//		}
//
//		if (notifiedEvents.contains("issue_note_added") && journal.getNotes() != null
//				&& !journal.getNotes().trim().isEmpty()) {
//			return true;
//		}
//
//		if (notifiedEvents.contains("issue_status_updated") && journal.newStatus() != null) {
//			return true;
//		}
//
//		// 检查其他事件类型
//		if (notifiedEvents.contains("issue_assigned_to_updated")
//				&& journal.detailForAttribute("assigned_to_id") != null) {
//			return true;
//		}
//
//		if (notifiedEvents.contains("issue_priority_updated") && journal.newValueFor("priority_id") != null) {
//			return true;
//		}
//
//		if (notifiedEvents.contains("issue_fixed_version_updated")
//				&& journal.detailForAttribute("fixed_version_id") != null) {
//			return true;
//		}
//
//		if (notifiedEvents.contains("issue_attachment_added") && journal.getDetails().stream()
//				.anyMatch(d -> "attachment".equals(d.getProperty()) && d.getValue() != null)) {
//			return true;
//		}
//
//		return false;
//	}
//
//	/**
//	 * 示例用法
//	 */
//	public static void main(String[] args) {
//		TJournalService service = new TJournalService();
//
//		// 创建新的Journal记录
//		Journal journal = service.createJournal("Issue", 123L, 1L, "修复了某个bug");
//
//		// 记录属性变更
//		service.journalizeAttributeChange(journal, "status_id", "1", "2");
//		service.journalizeCustomFieldChange(journal, 5L, "旧值", "新值");
//
//		// 保存并发送通知
//		if (journal.save()) {
//			service.sendNotifications(journal);
//			System.out.println("Journal记录创建成功: " + journal);
//		}
//	}
//
//	/**
//	 * 记录附件变更
//	 */
//	public void journalizeAttachment(Attachment attachment, String action) {
//		JournalDetail detail = new JournalDetail();
//		detail.setProperty("attachment");
//		detail.setPropKey(attachment.getId().toString());
//
//		if ("removed".equals(action)) {
//			detail.setOldValue(attachment.getFilename());
//		} else {
//			detail.setValue(attachment.getFilename());
//		}
//
//		details.add(detail);
//	}
//
//	/**
//	 * 记录关系变更
//	 */
//	public void journalizeRelation(Relation relation, String action) {
//		JournalDetail detail = new JournalDetail();
//		detail.setProperty("relation");
//		detail.setPropKey(relation.getRelationType());
//
//		if ("removed".equals(action)) {
//			detail.setOldValue(relation.getOtherIssueId().toString());
//		} else {
//			detail.setValue(relation.getOtherIssueId().toString());
//		}
//
//		details.add(detail);
//	}
//
//	/**
//	 * 获取指定属性的变更详情
//	 */
//	public JournalDetail detailForAttribute(String attribute) {
//		return details.stream().filter(detail -> attribute.equals(detail.getPropKey())).findFirst().orElse(null);
//	}
//
//	/**
//	 * 获取属性的新值
//	 */
//	public String newValueFor(String prop) {
//		JournalDetail detail = detailForAttribute(prop);
//		return detail != null ? detail.getValue() : null;
//	}
//
//	/**
//	 * 获取新的状态
//	 */
//	public IssueStatus newStatus() {
//		String statusId = newValueFor("status_id");
//		return statusId != null ? IssueStatus.findById(Long.parseLong(statusId)) : null;
//	}
//
//	/**
//	 * 检查是否可编辑
//	 */
//	public boolean editableBy(User user) {
//		if (user == null || !user.isLogged()) {
//			return false;
//		}
//
//		Project project = getProject();
//		if (project == null) {
//			return false;
//		}
//
//		return user.allowedTo("edit_issue_notes", project)
//				|| (Objects.equals(this.user, user) && user.allowedTo("edit_own_issue_notes", project));
//	}
//
//	/**
//	 * 获取项目
//	 */
//	public Project getProject() {
//		if (journalized != null && journalized instanceof ProjectAssociated) {
//			return ((ProjectAssociated) journalized).getProject();
//		}
//		return null;
//	}
//
//	/**
//	 * 获取附件列表
//	 */
//	public List<Attachment> getAttachments() {
//		List<Attachment> attachments = new ArrayList<>();
//		// 实现从details中提取附件信息
//		return attachments;
//	}
//
//	/**
//	 * 获取CSS类名
//	 */
//	public String getCssClasses() {
//		StringBuilder css = new StringBuilder("journal");
//		if (notes != null && !notes.trim().isEmpty()) {
//			css.append(" has-notes");
//		}
//		if (!details.isEmpty()) {
//			css.append(" has-details");
//		}
//		if (Boolean.TRUE.equals(privateNotes)) {
//			css.append(" private-notes");
//		}
//		return css.toString();
//	}
//
//	/**
//	 * 检查是否需要通知
//	 */
//	public boolean shouldNotify() {
//		return notify != null ? notify : true;
//	}
//
//	/**
//	 * 获取通知的用户
//	 */
//	public List<User> getNotifiedUsers() {
//		List<User> notified = new ArrayList<>();
//		if (journalized != null && journalized instanceof Notifiable) {
//			notified = ((Notifiable) journalized).getNotifiedUsers();
//		}
//
//		if (Boolean.TRUE.equals(privateNotes)) {
//			Project project = getProject();
//			notified.removeIf(user -> !user.allowedTo("view_private_notes", project));
//		}
//
//		return notified;
//	}
//
//	/**
//	 * 生成变更详情
//	 */
//	private void journalizeChanges() {
//		// 实现属性变更和自定义字段变更的记录逻辑
//		// 类似于Ruby版本中的journalize_changes方法
//	}
//
//	/**
//	 * 添加属性变更详情
//	 */
//	private void addAttributeDetail(String attribute, Object oldValue, Object value) {
//		addDetail("attr", attribute, oldValue, value);
//	}
//
//	/**
//	 * 添加自定义字段变更详情
//	 */
//	private void addCustomFieldDetail(Long customFieldId, Object oldValue, Object value) {
//		addDetail("cf", customFieldId.toString(), oldValue, value);
//	}
//
//	/**
//	 * 添加变更详情
//	 */
//	private void addDetail(String property, String propKey, Object oldValue, Object value) {
//		JournalDetail detail = new JournalDetail();
//		detail.setProperty(property);
//		detail.setPropKey(propKey);
//		detail.setOldValue(oldValue != null ? oldValue.toString() : null);
//		detail.setValue(value != null ? value.toString() : null);
//		details.add(detail);
//	}
//
//	public boolean equals(Object o) {
//		if (this == o)
//			return true;
//		if (o == null || getClass() != o.getClass())
//			return false;
//		Journal journal = (Journal) o;
//		return Objects.equals(id, journal.id);
//	}
//
//}
